package com.lianniu.mgr.baseService.area.service.impl;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import com.lianniu.mgr.baseService.staff.dao.ILogMapperDao;
import com.lianniu.mgr.baseService.staff.model.LogVo;
import com.lianniu.mgr.baseService.staff.model.PrecinctReturnVo;
import com.lianniu.mgr.baseService.staff.model.Staff2SysAreaVo;
import com.lianniu.mgr.util.StringUtil;
import org.apache.log4j.Logger;
import com.lianniu.mgr.base.BaseResult;
import com.lianniu.mgr.baseService.area.dao.ISystemAreaMapperDao;
import com.lianniu.mgr.baseService.area.model.SystemAreaVo;
import com.lianniu.mgr.baseService.area.service.ISystemAreaService;
import com.lianniu.mgr.constants.ErrorCode;
import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSON;
import org.springframework.transaction.annotation.Transactional;

/**
 * @ClassName：类名
 * @Description:类的功能描述

 * @Since: 作成日期
 * @Version:版本
 */
@Service
public class SystemAreaServiceImpl implements ISystemAreaService {
  private final static Logger logger = Logger.getLogger(SystemAreaServiceImpl.class);
  private final static Long NATION_LEVEL=(long) 1;//区域全国层级
  private final static Long PROVINCE_LEVEL=(long) 2;//区域省层级
  private final static Long CITY_LEVEL=(long) 3;//区域市层级
  private final static Long COUNTY_LEVEL=(long) 4;//区域县层级

  @Resource
  private ISystemAreaMapperDao systemAreaDao;

  @Resource
  private ILogMapperDao logMapperDao;


  @Override
  public BaseResult getAllSysArea() {
    logger.info("getAllSysArea begin");
    List<SystemAreaVo> list = systemAreaDao.getAllSysArea();
    logger.info("getAllSysArea end");
    return BaseResult.success(list);
  }

  @Override
  public BaseResult getParentSysAreaByAreaId(String areaId) {
    logger.info("getParentSysAreaByAreaId begin");
    logger.info("areaId:" + areaId);
    SystemAreaVo vo = systemAreaDao.getParentSysAreaByAreaId(areaId);
    logger.info("getParentSysAreaByAreaId end");
    return BaseResult.success(vo);
  }

  @Override
  public BaseResult getSysAreaByAreaId(String areaId) {
    logger.info("getSysAreaByAreaId begin");
    logger.info("areaId:" + areaId);
    SystemAreaVo vo = systemAreaDao.getSysAreaByAreaId(areaId);
    logger.info("getSysAreaByAreaId end");
    return BaseResult.success(vo);
  }


  @Override
  public BaseResult isExistSysAreaCode(String id, String areaCode) {
    logger.info("isExistSysAreaCode begin");
    int num = systemAreaDao.isExistSysAreaCode(id,areaCode);
    logger.info("isExistSysAreaCode end");
    if(num>0){
      return BaseResult.fail(ErrorCode.ParaCheckErrorRetCode, ErrorCode.ParaCheckErrorRetInfo);
    }
    return BaseResult.success(num);
  }

  /**
   * @Description:根据staffId获得员工的数据（区域）权限
   * @param staffId
   * @return BaseResult
   
   * @Date:2016年9月27日下午4:08:17
   * @Version 1.0.0
   */
  @Override
  public BaseResult getAreaByStaffId(String staffId) {
    logger.info("SystemAreaServiceImpl getAreaByStaffId begin.");
    logger.info("员工id&staffId:"+staffId);

    logger.info("SystemAreaServiceImpl getAreaByStaffId getAreaByStaffId begin.");
    List<SystemAreaVo> allAreaLi=systemAreaDao.getAreaByStaffId(staffId);
    logger.info("SystemAreaServiceImpl getAreaByStaffId getAreaByStaffId end.");

    logger.info("SystemAreaServiceImpl getAreaByStaffId end.");
    return BaseResult.success(allAreaLi);
  }

  /**
   * @Description:根据staffId获得员工的数据（区域）权限
   * @param staffId
   * @return BaseResult
   
   * @Date:2016年11月10日上午9:57:45
   * @Version 1.1.0
   */
  @Override
  public BaseResult getRootNodeAreasByStaffId(String staffId) {
    logger.info("SystemAreaServiceImpl getRootNodeAreasByStaffId begin.");
    logger.info("员工id:"+staffId);

    logger.info("SystemAreaServiceImpl getAreaByStaffId getRootNodeAreasByStaffId begin.");
    List<SystemAreaVo> rootLi=systemAreaDao.getRootNodeAreasByStaffId(staffId);
    logger.info("SystemAreaServiceImpl getAreaByStaffId getRootNodeAreasByStaffId end.");

    String nation="";
    List<String> provinceLi=new ArrayList<String>();
    List<String> cityLi=new ArrayList<String>();
    List<String> countyLi=new ArrayList<String>();

    PrecinctReturnVo prVo=new PrecinctReturnVo();
    for(SystemAreaVo vo:rootLi){
      if(NATION_LEVEL==vo.getLevel()){
        nation=vo.getAreaId();
        continue;
      }
      if(PROVINCE_LEVEL==vo.getLevel()){
        provinceLi.add(vo.getAreaId());
        continue;
      }
      if(CITY_LEVEL==vo.getLevel()){
        cityLi.add(vo.getAreaId());
        continue;
      }
      if(COUNTY_LEVEL==vo.getLevel()){
        countyLi.add(vo.getAreaId());
        continue;
      }
    }

    prVo.setNation(nation);
    prVo.setProvinceLi(provinceLi);
    prVo.setCityLi(cityLi);
    prVo.setCountyLi(countyLi);

    logger.info("SystemAreaServiceImpl getRootNodeAreasByStaffId end.");
    return BaseResult.success(prVo);
  }

  /**
   * @Description:获取省市县区域信息
   * @param staffId
   * @return BaseResult
   
   * @Date:2016年10月12日上午11:09:35
   * @Version 1.0.0
   */
  @Override
  public BaseResult getProToCouAreaByStaffId(String staffId) {
    logger.info("SystemAreaServiceImpl getProToCouAreaByStaffId begin.");
    logger.info("员工id&staffId:"+staffId);

    logger.info("SystemAreaServiceImpl getProToCouAreaByStaffId getProToCouAreaByStaffId begin.");
    List<Staff2SysAreaVo> li=systemAreaDao.getProToCouAreaByStaffId(staffId);
    logger.info("SystemAreaServiceImpl getProToCouAreaByStaffId getProToCouAreaByStaffId end.");

    logger.info("SystemAreaServiceImpl getProToCouAreaByStaffId end.");
    return BaseResult.success(li);
  }

  /**
   * @Description:添加员工管辖区域信息
   * @param staffId
   * @Param userName
   * @param areaIdArr
   * @param oldAreas
   * @Param newAreas
   * @return BaseResult
   
   * @Date:2016年10月12日上午11:32:44
   * @Version 1.0.0
   */
  @Override
  @Transactional(value = "mtransactionManager")
  public BaseResult addPrecinct(String staffId,String userName,String[] areaIdArr,String[] oldAreas,String[] newAreas,String[] rootNodes) {
    logger.info("SystemAreaServiceImpl addPrecinct begin.");
    logger.info("员工id&staffId:"+staffId);
    logger.info("登录者&userName:"+userName);
    logger.info("区域id数组&areaIdArr:"+JSON.toJSONString(areaIdArr));
    logger.info("oldAreas名:"+JSON.toJSONString(oldAreas));
    logger.info("newAreas名:"+JSON.toJSONString(newAreas));
    logger.info("rootNodes区域树根节点id:"+JSON.toJSONString(rootNodes));

    //日志记录
    //修改数据权限前后
    //新增的
    List<String> addAreas=new ArrayList<String>();
    if(newAreas!=null&&newAreas.length>0){
      for(String str:newAreas){
        addAreas.add(str);
      }
    }
    //删除的
    List<String> delAreas=new ArrayList<String>();
    if(oldAreas!=null&&oldAreas.length>0){
      for(String str:oldAreas){
        delAreas.add(str);
      }
    }
    //前后相同的
    List<String> publicAreas=new ArrayList<String>();

    //取出相同的即未改变的区域
    if(oldAreas!=null&&oldAreas.length>0&&newAreas!=null&&newAreas.length>0){
      for(String olds:oldAreas){
        for(String news:newAreas){
          if(olds.equals(news)){
            publicAreas.add(olds);
            break;
          }
        }
      }
      for(String str:publicAreas){
        int a=addAreas.indexOf(str);
        int d=delAreas.indexOf(str);
        if(a>-1){
          addAreas.remove(a);
        }
        if(d>-1){
          delAreas.remove(d);
        }

      }

    }else if(oldAreas==null&&newAreas!=null){
      for(String news:newAreas){
        addAreas.add(news);
      }
    }else if(oldAreas!=null&&newAreas==null){
      for(String olds:oldAreas){
        delAreas.add(olds);
      }
    }else if(oldAreas==null&&newAreas==null){
      return BaseResult.success();
    }

    String log = getPrecinctLog(addAreas,delAreas);

    if (!StringUtil.isEmpty(log)) {
      LogVo logVo = new LogVo();
      logVo.setLogId(StringUtil.getUUID());
      logVo.setStaffId(staffId);
      logVo.setLog(log);
      logVo.setAddUser(userName);
      logger.info("SystemAreaServiceImpl addPrecinct addLog begin.");
      logMapperDao.addLog(logVo);
      logger.info("SystemAreaServiceImpl addPrecinct addLog end.");
    }


    //删除数据权限
    logger.info("SystemAreaServiceImpl addPrecinct delPrecintByStaffId begin.");
    systemAreaDao.delPrecintByStaffId(staffId);
    logger.info("SystemAreaServiceImpl addPrecinct delPrecintByStaffId end.");

    if(null==areaIdArr){
      logger.info("用户数据权限变为空");
      return BaseResult.success();
    }

    List<Staff2SysAreaVo> li=new ArrayList<Staff2SysAreaVo>();
    for(String areaId:areaIdArr){
      Staff2SysAreaVo vo=new Staff2SysAreaVo();
      vo.setId(StringUtil.getUUID());
      vo.setStaffId(staffId);
      vo.setAreaId(areaId);
      li.add(vo);
    }


    //分配数据权限
    logger.info("SystemAreaServiceImpl addPrecinct addPrecinct begin.");
    systemAreaDao.addPrecinct(li);
    logger.info("SystemAreaServiceImpl addPrecinct addPrecinct end.");

    //给区域树根节点做标记
    logger.info("SystemAreaServiceImpl addPrecinct addRootNodes begin.");
    systemAreaDao.addRootNodes(staffId,rootNodes);
    logger.info("SystemAreaServiceImpl addPrecinct addRootNodes end.");

    return BaseResult.success();
  }

  /**
   * @Description:数据权限日志
   * @param addAreas
   * @param delAreas
   * @return String
   
   * @Date:2016年10月19日下午3:29:34
   * @Version 1.0.0
   */
  private String getPrecinctLog(List<String> addAreas,List<String> delAreas){
    StringBuffer sb=new StringBuffer();
    if(addAreas!=null&&addAreas.size()>0){
      sb.append("管辖区域 新增 ");
      for(int i=0;i<addAreas.size();++i){
        sb.append(addAreas.get(i)+",");
      }
    }

    if(delAreas!=null&&delAreas.size()>0){
      sb.append("管辖区域 删除 ");
      for(int i=0;i<delAreas.size();++i){
        sb.append(delAreas.get(i)+",");
      }
    }

    String log=sb.toString();
    if(!StringUtil.isEmpty(log)){
      log=log.substring(0, log.length()-1);
    }
    if(log.length()>500){
      log=log.substring(0, 490)+"...";
    }
    return log;

  }

  /**
   * @Description:获得全国，省，市，县4级区域信息
   * @param isChecked
   * @return BaseResult
   
   * @Date:2016年10月18日上午9:58:40
   * @Version 1.1.0
   */
  @Override
  public BaseResult get4LevelAreas(String isChecked) {
    logger.info("SystemAreaServiceImpl get4LevelAreas begin.");
    logger.info("是否被选中&isChecked:"+isChecked);

    logger.info("SystemAreaServiceImpl get4LevelAreas get4LevelAreas begin.");
    List<Staff2SysAreaVo> li=systemAreaDao.get4LevelAreas();
    logger.info("SystemAreaServiceImpl get4LevelAreas get4LevelAreas end.");

    for(Staff2SysAreaVo vo:li){
      vo.setIsChecked(isChecked);
    }
    return BaseResult.success(li);
  }

  /**
   * @Description:根据区域id获得下一级区域信息
   * @param areaId
   * @return BaseResult
   
   * @Date:2016年10月28日上午11:21:03
   * @Version 1.0.0
   */
  @Override
  public BaseResult getChildAreaByAreaId(String areaId) {
    logger.info("SystemAreaServiceImpl getChildAreaByAreaId begin.");
    logger.info("入参areaId："+areaId);

    logger.info("SystemAreaServiceImpl getChildAreaByAreaId getChildAreaByAreaId begin.");
    List<SystemAreaVo> li=systemAreaDao.getChildAreaByAreaId(areaId);
//  logger.info("SystemAreaServiceImpl getChildAreaByAreaId getChildAreaByAreaId li："+JSON.toJSONString(li));
    logger.info("SystemAreaServiceImpl getChildAreaByAreaId getChildAreaByAreaId end.");

    logger.info("SystemAreaServiceImpl getChildAreaByAreaId end.");
    return BaseResult.success(li);
  }

  /**
   * @Description:获得辖区县（企通宝接口）
   * @param staffId
   * @return BaseResult
   
   * @Date:2016年11月15日下午3:36:10
   * @Version 1.1.0
   */
  @Override
  public BaseResult getPrecinctCounty(String staffId) {
    logger.info("SystemAreaServiceImpl getPrecinctCounty begin.");
    logger.info("员工id&staffId:"+staffId);

    logger.info("SystemAreaServiceImpl getPrecinctCounty getAreaByStaffId begin.");
    List<SystemAreaVo> allAreaLi=systemAreaDao.getAreaByStaffId(staffId);
    logger.info("SystemAreaServiceImpl getPrecinctCounty getAreaByStaffId end.");

    //筛选出县辖区
    List<SystemAreaVo> countyLi=new ArrayList<SystemAreaVo>();
    for(SystemAreaVo vo:allAreaLi){
      if(4==vo.getLevel()){
        countyLi.add(vo);
      }
    }

    logger.info("SystemAreaServiceImpl getPrecinctCounty end.");
    return BaseResult.success(countyLi);
  }
  /**
   * @Description:根据staffId获得员工的数据（区域）权限
   * @param
   * @return BaseResult
   
   * @Date:2016年9月27日下午4:08:17
   * @Version 1.0.0
   */
  @Override
  public BaseResult getAreaLs() {
    logger.info("SystemAreaServiceImpl getAreaLs begin.");
    List<SystemAreaVo> allAreaLi=systemAreaDao.getAreaLs();

    logger.info("SystemAreaServiceImpl getAreaLs end.");
    return BaseResult.success(allAreaLi);
  }
  /**
   * @Description:获得辖区乡镇（企通宝接口）
   * @param staffId
   * @return BaseResult
   
   * @Date:2016年11月19日上午11:50:51
   * @Version 1.0.0
   */
  @Override
  public BaseResult getPrecinctTown(String staffId) {
    logger.info("SystemAreaServiceImpl getPrecinctTown begin.");
    logger.info("入参staffId:"+staffId);

    logger.info("SystemAreaServiceImpl getPrecinctTown getPrecinctTown begin.");
    List<SystemAreaVo> townLi=systemAreaDao.getPrecinctTown(staffId);
    logger.info("SystemAreaServiceImpl getPrecinctTown getPrecinctTown end.");

    logger.info("SystemAreaServiceImpl getPrecinctTown end.");
    return BaseResult.success(townLi);
  }
  /**
   * @Description:根据parentId查询区域信息(systemArea)
   * @param parentId
   * @return BaseResult
   * @Author:wangq
   * @Date:2016年11月18日
   * @Version 1.0.0
   */
  @Override
  public BaseResult getByParentId(String parentId) {
    logger.info("getByParentId begin");
    logger.info("parentId:"+parentId);
    if(StringUtil.isEmpty(parentId)){
      return BaseResult.fail(ErrorCode.ParaCheckErrorRetCode, ErrorCode.ParaCheckErrorRetInfo);
    }
    List<SystemAreaVo> list=systemAreaDao.getByParentId(parentId);
    logger.info("getByParentId end");
    return BaseResult.success(list);
  }

  /**
   * @Description:获取员工管辖区域下的县id集合
   * @param staffId
   * @return BaseResult
   
   * @Date:2016年12月5日下午4:16:18
   * @Version 1.0.0
   */
  @Override
  public BaseResult getCountyIdLiByStaffId(String staffId) {
    logger.info("SystemAreaServiceImpl getCountyIdLiByStaffId begin.");
    logger.info("员工id:"+staffId);

    logger.info("SystemAreaServiceImpl getCountyIdLiByStaffId getCountyIdLiByStaffId begin.");
    List<String> countyLi=systemAreaDao.getCountyIdLiByStaffId(staffId);
    logger.info("SystemAreaServiceImpl getCountyIdLiByStaffId getCountyIdLiByStaffId end.");

    logger.info("SystemAreaServiceImpl getCountyIdLiByStaffId end.");
    return BaseResult.success(countyLi);
  }

  /**
   * @Description:获取员工管辖区域下的省信息集合
   * @param staffId
   * @return List<SystemAreaVo>
   
   * @Date:2016年12月29日下午3:23:03
   * @Version 1.1.0
   */
  @Override
  public List<SystemAreaVo> getProvincesByStaffId(String staffId) {
    logger.info("SystemAreaServiceImpl getProvincesByStaffId begin.");
    logger.info("员工id:"+staffId);

    logger.info("..getProvincesByStaffId begin.");
    List<SystemAreaVo> li=systemAreaDao.getProvincesByStaffId(staffId);
    logger.info("..getProvincesByStaffId 员工管辖区域省信息列表："+JSON.toJSONString(li));
    logger.info("..getProvincesByStaffId end.");

    logger.info("SystemAreaServiceImpl getProvincesByStaffId end.");
    return li;
  }

  @Override
  public BaseResult addSysArea(SystemAreaVo areaVo) {
    logger.info("addSysArea begin");
    logger.info("asAreaInfoVo:" +JSON.toJSONString(areaVo));
    int result=systemAreaDao.addSysArea(areaVo);
    logger.info("addSysArea end");
    return BaseResult.success(result);
  }


  @Override
  public BaseResult editSysArea(SystemAreaVo areaVo) {
    logger.info("editSysArea begin");
    logger.info("asAreaInfoVo:" +JSON.toJSONString(areaVo));
    int result=systemAreaDao.editSysArea(areaVo);
    logger.info("editSysArea end");
    return BaseResult.success(result);
  }

}
